package io.github.eiot.charge.ykc.data;

import io.github.eiot.annotation.Frame;
import io.github.eiot.annotation.FrameField;
import io.github.eiot.codec.BCD;

/**
 * Bms 错误报文 0x1B
 *
 * @author yan
 * @since 2025-09-06
 */
@Frame
public class YkcBmsError implements YkcHasTerminalNo, YkcHasGunNo {

    /**
     * 交易流水号 BCD码 16
     */
    @FrameField(len = 16)
    private BCD orderNo;

    /**
     * 桩编号 BCD码 7
     */
    @FrameField(len = 7)
    private BCD terminalNo;

    /**
     * 枪号 BIN码 1
     */
    @FrameField(len = 1)
    private int gunNo;

    /**
     * 状态信息，共64位
     * <p>
     * 接收 SPN2560=0x00 的充电机辨识报文超时 2位
     * 接收 SPN2560=0xAA 的充电机辨识报文超时 2位
     * 预留位 4位
     * 接收充电机的时间同步和充电机最大输出能力报文超时 2位
     * 接收充电机完成充电准备报文超时 2位
     * 预留位 4位
     * 接收充电机充电状态报文超时 2位
     * 接收充电机中止充电报文超时 2位
     * 预留位 4位
     * 接收充电机充电统计报文超时 2位
     * BMS 其他 6位
     * 接收 BMS 和车辆的辨识报文超时 2位
     * 预留位 6位
     * 接收电池充电参数报文超时  2位
     * 接收 BMS 完成充电准备报文超时  2位
     * 预留位  4位
     * 接收电池充电总状态报文超时  2位
     * 接收电池要求报文超时  2位
     * 接收 BMS 中止充电报文超时  2位
     * 预留位  2位
     * 接收 BMS 充电统计报文超时 2位
     * 充电机其他 6位
     * <00> = 正常; <01> = 超时; <10> = 不可信状态
     */
    @FrameField(len = 8)
    private long status;

    /**
     * getter auto generated
     */
    public BCD getOrderNo() {
        return orderNo;
    }

    /**
     * setter auto generated
     */
    public void setOrderNo(BCD orderNo) {
        this.orderNo = orderNo;
    }

    /**
     * setter auto generated
     */
    public void setOrderNo(String orderNo) {
        io.github.eiot.utils.ValidationUtil.lteLen(orderNo, 32, orderNo);
        this.orderNo = BCD.from(orderNo, 32);
    }

    /**
     * getter auto generated
     */
    public BCD getTerminalNo() {
        return terminalNo;
    }

    /**
     * setter auto generated
     */
    public void setTerminalNo(BCD terminalNo) {
        this.terminalNo = terminalNo;
    }

    /**
     * setter auto generated
     */
    public void setTerminalNo(String terminalNo) {
        io.github.eiot.utils.ValidationUtil.lteLen(terminalNo, 14, terminalNo);
        this.terminalNo = BCD.from(terminalNo, 14);
    }

    /**
     * getter auto generated
     */
    public int getGunNo() {
        return gunNo;
    }

    /**
     * setter auto generated
     */
    public void setGunNo(int gunNo) {
        this.gunNo = gunNo;
    }

    /**
     * getter auto generated
     */
    public long getStatus() {
        return status;
    }

    /**
     * setter auto generated
     */
    public void setStatus(long status) {
        this.status = status;
    }
}
